package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.NivelDAO;
import br.com.duosoftware.orcamento.daos.PlanoDeContaDAO;
import br.com.duosoftware.orcamento.entidades.Nivel;
import br.com.duosoftware.orcamento.entidades.PlanoDeConta;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Renato
 *
 */
@ManagedBean
@ViewScoped
public class PlanoDeContaBean implements Serializable {

    private PlanoDeConta planoDeConta;
    private List<PlanoDeConta> planosDeConta;
    private PlanoDeContaDAO planoDeContaDAO;
    //
    ///****Select Itens****
    //
    private List<SelectItem> niveis;

    public PlanoDeContaBean() {
        planoDeContaDAO = new PlanoDeContaDAO();
    }

    public PlanoDeConta getPlanoDeConta() {
        return planoDeConta;
    }

    public void setPlanoDeConta(PlanoDeConta planoDeConta) {
        this.planoDeConta = planoDeConta;
    }

    public List<PlanoDeConta> getPlanosDeConta() {
        if (planosDeConta == null) {
            planosDeConta = planoDeContaDAO.listarPlanosDeConta();
        }
        return planosDeConta;
    }

    public void setPlanosDeConta(List<PlanoDeConta> planosDeConta) {
        this.planosDeConta = planosDeConta;
    }

    /**
     * <b>Método que inicializa a planoDeConta a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        planoDeConta = new PlanoDeConta();

    }

    /**
     * <b>Método que adiciona ou edita uma PlanoDeConta</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        planoDeContaDAO.salvarOuAtualizar(planoDeConta);
        planoDeConta = new PlanoDeConta();
        planosDeConta = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgPlanoDeConta.hide()");
        requestContext.update("formPlanosDeConta:dtPlanosDeConta");

    }

    /**
     * <b>Método para iniciar o processo de edição de um PlanoDeConta.</b> <p>
     *
     * Ele verifica se há um PlanoDeConta selecionada para edição, se não houver
     * é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um PlanoDeConta selecionado o médoto abre o dialog para
     * edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (planoDeConta == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgPlanoDeConta.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um PlanoDeConta.</b> <p>
     *
     * Ele verifica se há uma PlanoDeConta selecionado para exclusão, se não
     * houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um PlanoDeConta selecionado o médoto abre um p:dialog para
     * confirma ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (planoDeConta == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirPlanoDeConta.show()");
        }

    }

    /**
     * <b>Método para excluir um PlanoDeConta.</b> <p>
     *
     * Ele verifica se a PlanoDeConta selecionado para exclusão está sendo
     * utilizado por alguma outra tabela do banco. Se estiver uma mensagem de
     * aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            planoDeContaDAO.excluir(planoDeConta);
            planoDeConta = new PlanoDeConta();
            planosDeConta = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirPlanoDeConta.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>
     *
     * O método instancia um novo objeto na variável PlanoDeConta para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        planoDeConta = new PlanoDeConta();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgPlanoDeConta.hide()");
        requestContext.update("formPlanoDeConta:dtPlanosDeConta");

    }

    //get SelectItens
    //
    public List<SelectItem> getNiveis() {

        if (niveis == null) { //Nos casos em que os dados são FIXOS

            niveis = new LinkedList<SelectItem>();

            for (Nivel nivel : new NivelDAO()
                    .listarNiveis()) {

                niveis.add(new SelectItem(nivel, nivel.toString()));

            }
        }
        return niveis;

    }
}
